/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.bakenbeans;

import com.icesoft.faces.component.outputchart.OutputChart;
import java.awt.Color;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.ugc.cnel.manabi.recursos.Utilidades;

/**
 *
 * @author Admin
 */
public class DatosIndicadoresCharts {

    Connection conexion = Utilidades.conexion();
    private String mes = "";
    private String xLabels;
    private String inspectores = "";
    private String inspecciones = "";
    private List<Color> datosinspeccionesColors = new ArrayList<Color>();
    private final int mesNumero;
    private String novedades = "";
    private String datosNovedades = "";
    private List<Color> datosNovedadesColors = new ArrayList<Color>();
    private String datosRecuperacion = "";
    private List<Color> datosRecuperacionColors = new ArrayList<Color>();
    private final int anio;

    public List<Color> getDatosinspeccionesColors() {
        return datosinspeccionesColors;
    }

    public void setDatosinspeccionesColors(List<Color> datosinspeccionesColors) {
        this.datosinspeccionesColors = datosinspeccionesColors;
    }

    public List<Color> getDatosNovedadesColors() {
        return datosNovedadesColors;
    }

    public void setDatosNovedadesColors(List<Color> datosNovedadesColors) {
        this.datosNovedadesColors = datosNovedadesColors;
    }

    public List<Color> getDatosRecuperacionColors() {
        return datosRecuperacionColors;
    }

    public void setDatosRecuperacionColors(List<Color> datosRecuperacionColors) {
        this.datosRecuperacionColors = datosRecuperacionColors;
    }

    public String getMes() {
        return mes;
    }

    public String getxLabels() {
        return xLabels;
    }

    public String getDatosNovedades() {
        return datosNovedades;
    }

    public void setDatosNovedades(String datosNovedades) {
        this.datosNovedades = datosNovedades;
    }

    public String getDatosRecuperacion() {
        return datosRecuperacion;
    }

    public void setDatosRecuperacion(String datosRecuperacion) {
        this.datosRecuperacion = datosRecuperacion;
    }

    public String getInspecciones() {
        return inspecciones;
    }

    public void setInspecciones(String inspecciones) {
        this.inspecciones = inspecciones;
    }

    public String getInspectores() {
        return inspectores;
    }

    public void setInspectores(String inspectores) {
        this.inspectores = inspectores;
    }

    public String getNovedades() {
        return novedades;
    }

    public void setNovedades(String novedades) {
        this.novedades = novedades;
    }

    

    private List<Color> color1 = Arrays.asList(new Color[]{new Color(0x5FB404), new Color(0x01DFD7)});

    public List<Color> getColor1() {
        return color1;
    }
    private OutputChart char1;

    public OutputChart getChar1() {
        return char1;
    }

    public void setChar1(OutputChart char1) {
        this.char1 = char1;
    }

    /** Creates a new instance of DatosIndicadoresCharts */
    public DatosIndicadoresCharts() {
        GregorianCalendar calendario = new GregorianCalendar();
        this.anio = calendario.get(Calendar.YEAR);
        this.mesNumero = calendario.get(Calendar.MONTH) + 1;
        this.mes = this.getMesNumeroToLetra(calendario.get(Calendar.MONTH) + 1);
        this.getQueryInspecciones();
        this.getQueryNovedades();
        this.getQueryRecuperacion();
    }

    public void actulizaDatos() {
        this.getQueryInspecciones();
        this.getQueryNovedades();
        this.getQueryRecuperacion();
    }

    private void getQueryInspecciones() {
        Statement sentencia = null;
        ResultSet rs = null;
        try {
            sentencia = conexion.createStatement();
            rs = sentencia.executeQuery("select max(ir.apellidos) || ' ' || max(ir.nombres) nombres, count(ip.id) total_inspecciones from inspector as ir left join inspeccion as ip on ir.id = ip.id_inspector " +
                    "where extract(year from fecha_inspeccion) = " + this.anio + " and extract(month from fecha_inspeccion) = " + this.mesNumero + " group by ir.id;");
            int c = 0;
            this.inspectores = "";
            this.inspecciones = "";
            while (rs.next()) {
                this.inspectores = this.inspectores + rs.getString(1);
                this.inspecciones = this.inspecciones + rs.getInt(2);
                if (c < color_inspecciones.length) {
                    datosinspeccionesColors.add(new Color(color_inspecciones[c]));
                } else {
                    Random rand = new Random();
                    datosinspeccionesColors.add(new Color(rand.nextInt(256),
                            rand.nextInt(256),
                            rand.nextInt(256)));
                }
                if (!rs.isLast()) {
                    this.inspectores = this.inspectores + ", ";
                    this.inspecciones = this.inspecciones + ": ";
                }
                c++;
            }
            if (c == 0) {
                this.inspectores = "0,0";
                this.inspecciones = "0:0";
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatosIndicadoresCharts.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private int[] color_inspecciones = {
        0x008787,
        0x003366,
        0x003366,
        0xFFCC66,
        0x0000FF,
        0xFFFFCC,
        0xFFAA78,
        0xFF9090,
        0x5DA5FF,
        0x5DA5FF
    };
    private int colors_novedades[] = {
        0x000089,
        0x0000FF,
        0x99FF99,
        0x996600,
        0x333399,
        0x0000CC
    };
    private int colors_recuperacion[] = {
        0xBF355D,
        0x607BED,
        0x52ED81,
        0xF2482D,
        0x83BFA1,
        0xEDE75A
    };

    private void getQueryNovedades() {
        Statement sentencia = null;
        ResultSet rs = null;
        try {
            sentencia = conexion.createStatement();
            rs = sentencia.executeQuery("select	max(descripcion)as descripcion, cast(cast(count(i.id_novedad) as float)/(select count(id_novedad) as total_novedades from inspeccion where extract(year from fecha_inspeccion) = cast(" + this.anio + " as float) and extract(month from fecha_inspeccion) = cast(" + this.mesNumero + " as float))*100 as numeric(10)) as porc_novedades " +
                    "from novedad n inner join inspeccion i on n.id = i.id_novedad where extract(year from fecha_inspeccion) = cast(" + this.anio + " as float) and extract(month from fecha_inspeccion) = cast(" + this.mesNumero + " as float) " +
                    "group by n.id");
            int c = 0;
            this.novedades = "";
            this.datosNovedades = "";
            while (rs.next()) {
                this.novedades = this.novedades + rs.getString(1);
                this.datosNovedades = this.datosNovedades + rs.getInt(2);
                if (c < colors_novedades.length) {
                    datosNovedadesColors.add(new Color(colors_novedades[c]));
                } else {
                    Random rand = new Random();
                    datosNovedadesColors.add(new Color(rand.nextInt(256),
                            rand.nextInt(256),
                            rand.nextInt(256)));
                }
                if (!rs.isLast()) {
                    this.novedades = this.novedades + ", ";
                    this.datosNovedades = this.datosNovedades + ", ";
                }
                c++;
            }
            if (c == 0) {
                this.novedades = "0,0";
                this.datosNovedades = "0,0";
            }
        } catch (SQLException ex) {
            Logger.getLogger(DatosIndicadoresCharts.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void getQueryRecuperacion() {
        Statement sentencia = null;
        ResultSet rs = null;
        try {
            sentencia = conexion.createStatement();
            rs = sentencia.executeQuery("select sum(recu_neta) as total_recup_neta_KWH, sum(recu_acumulada) as total_recup_acumulada_KWH, sum(recu_neta)*(select valor from parametros where nombre like 'Costo KWH') as total_recup_neta_DOL , sum(recu_acumulada)*(select valor from parametros where nombre like 'Costo KWH') as total_recup_acumulada_DOL  " +
                    "from inspeccion where extract(year from fecha_inspeccion) = cast(" + this.anio + " as float) and " +
                    "extract(month from fecha_inspeccion) = cast(" + this.mesNumero + " as float)");
            int c = 0;
            this.datosRecuperacion = "";
            if (rs.next()) {

                this.datosRecuperacion = ((rs.getString(1) == null) ? "0" : rs.getString(1)) + ", " +
                        ((rs.getString(2) == null) ? "0" : rs.getString(2)) + ": " +
                        ((rs.getString(3) == null) ? "0" : rs.getString(3)) + ", " +
                        ((rs.getString(4) == null) ? "0" : rs.getString(4));

                if (c < colors_recuperacion.length) {
                    datosRecuperacionColors.add(new Color(colors_recuperacion[c]));
                    datosRecuperacionColors.add(new Color(colors_recuperacion[c + 1]));
                } else {
                    Random rand = new Random();
                    int one = rand.nextInt(200), two = rand.nextInt(200), three = rand.nextInt(200);

                    datosRecuperacionColors.add(new Color(one, two, three));
                    datosRecuperacionColors.add(new Color(one + 10, two + 10, three + 10));
                }
                c++;
            }

        } catch (SQLException ex) {
            Logger.getLogger(DatosIndicadoresCharts.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private String getMesNumeroToLetra(int mesActual) {
        String mesLetra = null;
        switch (mesActual) {
            case 1:
                mesLetra = "Enero";
                break;
            case 2:
                mesLetra = "Febrero";
                break;
            case 3:
                mesLetra = "Marzo";
                break;
            case 4:
                mesLetra = "Abril";
                break;
            case 5:
                mesLetra = "Mayo";
                break;
            case 6:
                mesLetra = "Junio";
                break;
            case 7:
                mesLetra = "Julio";
                break;
            case 8:
                mesLetra = "Agosto";
                break;
            case 9:
                mesLetra = "Septiembre";
                break;
            case 10:
                mesLetra = "Octubre";
                break;
            case 11:
                mesLetra = "Noviembre";
                break;
            case 12:
                mesLetra = "Diciembre";
                break;
        }
        return mesLetra;
    }
}
